import cv2 as cv
import numpy as np

# ------------------------人脸检测---------------
# 加载人脸检测分类器
face_cascade = cv.CascadeClassifier('/home/hs/Desktop/opencv_venv/learn-pi/OpenCv/Test/venv/lib/python3.11/site-packages/cv2/data/haarcascade_frontalface_default.xml')
# 加载眼睛检测分类器
eyes_cascade = cv.CascadeClassifier('/home/hs/Desktop/opencv_venv/learn-pi/OpenCv/Test/venv/lib/python3.11/site-packages/cv2/data/haarcascade_eye.xml')

# 初始化摄像头
cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 480)

# 检查摄像头是否成功打开
if not cap.isOpened():
    print("无法打开摄像头！")
    exit()


while True:
    # 读取摄像头帧
    ret, frame = cap.read()
    if not ret:
        print("无法获取帧！")
        break

    # # 读取图片
    # img = cv.imread('pengyuyan.jpeg')

    # 灰度化
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(60, 60), maxSize= None)
    # 参数说明：
    # gray：灰度图像
    # scaleFactor：在每一级图像中，检测到目标的比例系数，越小越精确，但速度越慢。1.05 ~ 1.5，默认值 1.2
    # minNeighbors：每个候选矩形框需要至少被多少个相邻的矩形框验证为有效。值越大，误检率越低，但可能漏检真实目标，通常为 3 ~ 6，默认值 3。
    # minSize：检测目标的最小可能尺寸（宽 × 高），小于此尺寸的目标将被忽略。单位像素
    # maxSize：检测目标的最大可能尺寸（宽 × 高），大于此尺寸的目标将被忽略。单位像素


    # 绘制矩形框
    for face in faces:
        x, y, w, h = face
        cv.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

        # #  在人脸区域进行眼睛检测
        # roi_color = frame[y:y+h, x:x+w]
        # roi_gray = gray[y:y+h, x:x+w]
        # eyes = eyes_cascade.detectMultiScale(roi_gray)
        # for (ex, ey, ew, eh) in eyes:
        #     cv.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (255, 0, 0), 2)

    # 显示实时画面
    cv.imshow("Live Camera", frame)

    # 键盘检测
    key = cv.waitKey(1) & 0xFF
    # O键退出程序
    if key == ord('o') or key == ord('O'):
        print("正在退出程序...")
        break

# 显示图片
# cv.imshow('img', img)
# cv.waitKey(0)
cv.destroyAllWindows()
